package com.aloda.result;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;

/**
 * 通用分页结果
 * @param <T>
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult<T> implements Serializable {

    /**
     * 数据总数
     */
    private Long total;

    /**
     * 分页集合
     */
    private List<T> records;


    /**
     * 返回空分页结果
     * @param p MybatisPlus的分页结果
     * @param <VO> 目标VO类型
     * @param <PO> 原始PO类型
     * @return VO的分页对象
     */
    public static <VO, PO> PageResult<VO> empty(Page<PO> p){
        return new PageResult<>(p.getTotal(), Collections.emptyList());
    }


    /**
     * 创建分页返回对象（属性拷贝方式）
     * @param page mapper层分页结果
     * @param clazz 返回VO类字节码
     * @return
     * @param <PO> 目标VO类型
     * @param <VO> 原始PO类型
     */
    public static <PO, VO> PageResult<VO> of(Page<PO> page, Class<VO> clazz) {
        PageResult<VO> pageResult = new PageResult<>();
        // 1.获取总数
        pageResult.setTotal(page.getTotal());
        // 2.获取数据集合
        List<PO> pageRecords = page.getRecords();
        if (CollUtil.isEmpty(pageRecords)) {
            pageResult.setRecords(Collections.emptyList());
            return pageResult;
        }
        // 3.拷贝数据
        pageResult.setRecords(BeanUtil.copyToList(pageRecords, clazz));
        // 4.返回
        return pageResult;
    }

    /**
     * 创建分页返回对象（自定义拷贝方式）
     * @param page mapper层分页结果
     * @param convertor 转化方式
     * @return
     * @param <PO> 目标VO类型
     * @param <VO> 原始PO类型
     */
    public static <PO, VO> PageResult<VO> of(Page<PO> page, Function<PO, VO> convertor) {
        PageResult<VO> pageResult = new PageResult<>();
        // 1.获取总数
        pageResult.setTotal(page.getTotal());
        // 2.获取数据集合
        List<PO> pageRecords = page.getRecords();
        if (CollUtil.isEmpty(pageRecords)) {
            pageResult.setRecords(Collections.emptyList());
            return pageResult;
        }
        // 3.拷贝数据
        pageResult.setRecords(pageRecords.stream().map(convertor).toList());
        // 4.返回
        return pageResult;
    }
}
